from django.contrib import admin

# 导入model
from coupon.models import CouponModel,CouponCourseModel,CouponCourseCategoryModel,CouponCourseDirectionModel,CouponLogModel
# redis
from django_redis import get_redis_connection
import json
# Register your models here.

# 方向
class CouponDirectionInline(admin.TabularInline):
    model = CouponCourseDirectionModel
    fields = ['id','direction']

# 分类
class CouponCategoryInline(admin.TabularInline):
    model = CouponCourseCategoryModel
    fields = ['id','category']


# 分类
class CouponCourseInline(admin.TabularInline):
    model = CouponCourseModel
    fields = ['id','course']


# 优惠券
class CouponModelAdmin(admin.ModelAdmin):
    list_display = ['id','name','start_time',"end_time",'total','has_total',"coupon_type",'get_type']
    inlines = [CouponDirectionInline,CouponCategoryInline,CouponCourseInline]

admin.site.register(CouponModel,CouponModelAdmin)


# 日志   优惠券管理
class CouponLogModelAdmin(admin.ModelAdmin):
    list_display = ['id','user','coupon','use_time','use_status']
    # 钩子函数
    def save_model(self, request, obj, form, change):
        # 在管理站点中点击保存的时候，自动触发的函数，钩子函数
        # request： 本次客户端提交的请求对象
        # obj：本次操作的模型类示例对象
        # form 提交的表单数据
        # change  True 表示更新数据，     false  表示添加新书数据
        obj.save()  #保存到数据库中，  mysql中
        # 同步到redis中
        redis = get_redis_connection('coupon')
        # 存哪些内容？？？？？
        if obj.use_status == 0 and obj.use_time == None:
            pipe = redis.pipeline()
            pipe.multi()

            # 往redis中存数据
            # 构建数据存储类型，优惠券中的属性，全部放到redis中
            coupon_dict = {
                "coupon_id":obj.coupon.id,
                "name":obj.coupon.name,
                "discount":obj.coupon.discount,  # 数据库实际存储了些，
                "get_discount_display":obj.coupon.get_discount_display(),
                "coupon_type":obj.coupon.coupon_type,
                "get_coupon_type_display":obj.coupon.get_coupon_type_display(),
                "get_type":obj.coupon.get_type,
                "get_get_type_display":obj.coupon.get_get_type_display(),
                "start_time":obj.coupon.start_time.strftime("%Y-%m-%d %H:%M:%S"),
                "end_time": obj.coupon.end_time.strftime("%Y-%m-%d %H:%M:%S"),
                "condition":obj.coupon.condition,
                "sale":obj.coupon.sale,
                "to_direction":json.dumps(list(obj.coupon.to_direction.values('direction__id','direction__name'))),
                "to_category":json.dumps(list(obj.coupon.to_category.values('category__id','category__name'))),
                "to_course":json.dumps(list(obj.coupon.to_course.values('course__id','course__name'))),

                # {
                #     优惠券信息：优惠券数据，
                #     to_direction：[
                #             {1,'前端'}，{2，后端}
                #             ]，
                #     to_category：[]
                #     to_course:[]
                # }
                # [<方向1>，<方向2>]
                # [{name:方向1，xxx:sss},{name：方向2}]
            }
            pipe.hset(f"{obj.user.id}:{obj.id}",mapping=coupon_dict)

            print('存入redis中的数据的key')
            print(f"{obj.user.id}:{obj.id}")
            from datetime import datetime
            # setex()
            # 根据key值，设置过期时间
            pipe.expire(f"{obj.user.id}:{obj.id}",  int(obj.coupon.end_time.timestamp() - datetime.now().timestamp()))
            # 最终写入redis
            pipe.execute()
        else:
            # 如果优惠券状态为使用过，或者是过期
            # 优惠券的有使用时间，表示使用过
            # 将数据，从redis中删除
            redis.delete(f"{obj.user.id}:{obj.id}")
    # 管理站点删除单条数据
    def delete_model(self, request, obj):
        redis = get_redis_connection("coupon")
        # 删除redis中的数据
        redis.delete(f"{obj.user.id}:{obj.id}")
        obj.delete()
    def delete_queryset(self, request, queryset):
        redis = get_redis_connection("coupon")
        # 删除redis中的数据
        for obj in queryset:
            redis.delete(f"{obj.user.id}:{obj.id}")
        # orm中，从mysq中删除数据
        queryset.delete()

admin.site.register(CouponLogModel,CouponLogModelAdmin)




